# InterfaceIterator.java

    package org.codefilarete.tool.bean;

    import java.util.Iterator;
    import java.util.List;

    import org.codefilarete.tool.collection.ArrayIterator;
    import org.codefilarete.tool.collection.Iterables;

    /**
     * An {@link java.util.Iterator} that gives interfaces of each class encountered in a hierarchy.
     *
     * @see ClassIterator
     * @see TypeIterator
     * @author Guillaume Mary
     */
    public class InterfaceIterator extends InheritedElementIterator<Class<?>> {

    	public InterfaceIterator(Class<?> aClass) {
    		this(new ClassIterator(aClass, null));
    	}

    	public InterfaceIterator(Iterator<Class<?>> classIterator) {
    		super(classIterator);
    	}

    	@Override
    	protected Class<?>[] getElements(Class<?> clazz) {
    		Class<?>[] interfaces = clazz.getInterfaces();
    		List<Class<?>> result = Iterables.copy(new ArrayIterator<>(interfaces));
    		// getting all (parent) interfaces of previous interfaces: we use our own class since getInterfaces() returns super interfaces of an interface
    		InterfaceIterator interfaceIterator = new InterfaceIterator(new ArrayIterator<>(interfaces));
    		Iterables.copy(interfaceIterator, result);
    		return result.toArray(new Class[0]);
    	}
    }